package cn.m3a1.task;

import cn.m3a1.dao.UserDao;
import cn.m3a1.model.*;
import com.iceking.dynamicweb.DWPConsole;
import com.iceking.dynamicweb.GlobalUtils;
import com.iceking.dynamicweb.Pagination;
import com.iceking.dynamicweb.TaskProcessor;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import java.io.File;
import java.util.List;

/**
 * @author wyj
 * @date 2019/6/5
 * @time 上午10:55
 */
public class StuleaveTask extends TaskProcessor {
    private User loginUser;
    public Boolean panduan(){
        loginUser = (User) getSession().getAttribute("loginUser");
        if (loginUser==null){
            return false;
        }

        int type=loginUser.getType();

        if (type!=1){
            return false;
        }
        return  true;
    }
    public void save() throws Exception{
        if (!panduan()){
            return;
        }

        boolean isMultipart= ServletFileUpload.isMultipartContent(request);
        if(!isMultipart) {
           // toFreemarker(ProjectUtils.errorView(1, "无效的文件上传表单", null));
            return;
        }

        int courseid=0;
        int type=0;
        //文件保存的根目录，配置文件中已经配置好了的
        File basicDir= DWPConsole.getInstance().getFplBaseDir();
        File temDir=new File(basicDir,"tmp");

        //保存上传文件夹的工厂类
        DiskFileItemFactory factory=new DiskFileItemFactory();
        //设置文件大小，5M，小于5M的保存在内存中，否则保存到临时文件夹中
        factory.setSizeThreshold(5*1024*1024);
        factory.setRepository(temDir);

        //构造本次文件上传的控制句柄对象
        ServletFileUpload upload=new ServletFileUpload(factory);
        //设置本次上传文件的最大值
        upload.setSizeMax(50*1024*1024);
        //设置文件的编码格式
        upload.setHeaderEncoding("utf-8");

        //开始获取表单中传递过来的数据
        List<FileItem> items=upload.parseRequest(request);

        if(GlobalUtils.isEmpty(items)) {
            //toFreemarker(ProjectUtils.errorView(1, "缺少表单内容", null));
            return;
        }

        //第一次循环，找出id属性
        int id=0;
        for(FileItem item:items) {
            if(item.isFormField() && "id".equals(item.getFieldName())) {
                //找到了id属性，获取值
                id=Integer.parseInt(item.getString());
                break;
            }
        }

        Absentnote absentnote=new Absentnote();

        //对表单属性进行第二次循环，将各项值放入到music对象中
        for(FileItem item:items) {
            if(item.isFormField()) {
                //一般的表单元素
                if("type".equals(item.getFieldName())) {
                    type=Integer.parseInt(item.getString("utf-8"));
                    absentnote.setType(type);
                }else if ("cid".equals(item.getFieldName())) {
                    courseid=Integer.parseInt(item.getString("utf-8"));
                    System.out.println("cid"+courseid);
                    absentnote.setCourseid(courseid);
                }else if ("period".equals(item.getFieldName())) {
                   absentnote.setPeriod(item.getString("utf-8"));
                }else if ("res".equals(item.getFieldName())) {
                    absentnote.setReason(item.getString("utf-8"));
                }
            }else {
                //需要进行上传的文件
                //第一步：将文件保存到网站相应的目录下
                //c:\aa新建文件.txt
                String filepath=item.getName();
                //获得文件的大小
                long filesize=item.getSize();
                //空文件不用保存
                if(filesize==0)
                {continue;}

                //开始保存文件
                //nameandext[0]="aa新建文件"
                //nameandext[1]="txt"
                String[] nameandext=GlobalUtils.getFileNameAndExt(filepath);
                String fileNewName=gnrNewFileName(nameandext[0], nameandext[1]);


                //构造新文件
                File file=new File(basicDir,fileNewName);
                file.createNewFile();
                //进行保存
                item.write(file);

                //将文件的路径放入到music
                absentnote.setExtfile("/uploadfiles/"+fileNewName);
            }
        }

        //存入学生id
        absentnote.setStudentid(loginUser.getId());
        absentnote.setTimestamp(System.currentTimeMillis());
        getDBConn().startTransaction();
        //根据班级id查询班主任id
        Pagination<Course> pgc = new Pagination<>();
        pgc.appendWhere("where id=?", courseid);
        getDBConn().select(Course.class, pgc);
        Course course = pgc.getFirstResult();
        absentnote.setClassid(course.getClassid());

        if (type==1){
            absentnote.setCourseid(0);

        }else if (type==2){
            absentnote.setTeacherid(course.getTeacherid());
        }
        //根据班级id查询班主任id
        Pagination<Tclass> pgt = new Pagination<>();
        pgt.appendWhere("where id=?", course.getClassid());
        getDBConn().select(Tclass.class, pgt);
        Tclass tclass = pgt.getFirstResult();
        absentnote.setManagerid(tclass.getManagerid());
        //对music进行保存
        getDBConn().save(absentnote);

        //记录日志
        Syslog syslog=new Syslog();
        syslog.setWho("学生，"+tclass.getName()+","+loginUser.getUsername());
        syslog.setWhat("申请请假");
        syslog.setWhattime(System.currentTimeMillis());
        getDBConn().save(syslog);
        getDBConn().stopTransaction();

    }
    /**
     * 根据文件名和扩展名，生成一个随机名字
     * @param oldName
     * @param fileExt
     * @return
     */
    private String gnrNewFileName(String oldName,String fileExt) {
        //加密
        String strMd5=GlobalUtils.md5Encode(oldName);
        //给新加的文件添加事件
        String strDate=GlobalUtils.timeToDateString(System.currentTimeMillis(), "yyyyMMddHHmmss");
        String newName=strMd5+"-"+strDate;
        if(!GlobalUtils.isEmpty(fileExt)) {
            newName=newName+"."+fileExt;
        }
        return newName;
    }

}
